import Diccionario
import Maybe
import Data.List

--Este m'odulo sirve para utilizar el diccionario sin acceder a su estructura interna. Pueden agregar otras funciones o casos de prueba.

{- Funci'on a implementar. -}

-- Esta funci'on se queda con el primero que es Nothing o es tesoro
-- partiendo de la pista.
busquedaDelTesoro :: Eq a => a -> (a -> Bool) -> Diccionario a a -> Maybe a 
busquedaDelTesoro inicial esTesoro d = head (dropWhile	(not.(cortar esTesoro))
														(obtenerRec d (Just inicial)))

-- obtengo anidadamente
obtenerRec :: Eq a => Diccionario a a -> Maybe a -> [Maybe a]
obtenerRec d = iterate (f d)
	where f = (\d c -> case c of
					Nothing -> Nothing
					Just q -> obtener q d)

-- funci'on para que corte el dropWhile, ya sea porque encuentra un Nothing
-- o porque encuentra alguno que cumple la funci'on f
cortar :: Eq a => (a -> Bool) -> Maybe a -> Bool
cortar _ Nothing = True
cortar f (Just x) = f x

{- Diccionarios de prueba: -}

dicc1::Diccionario Int String
dicc1 = definirVarias [(0,"Hola"),(-10,"Chau"),(15,"Felicidades"),(2,"etc."),(9,"a")] (vacio (<))

dicc2::Diccionario String String
dicc2 = definirVarias [("inicio","casa"),("auto","flores"),("calle","auto"),("casa","escalera"),("ropero","alfajor"),("escalera","ropero")] (vacio (<))

dicc3::Diccionario Int String
dicc3 = definirVarias [(0,"Hola"),(-10,"Chau"),(15,"Felicidades"),(2,"etc."),(9,"a")] (vacio (\x y->x `mod` 5 < y `mod` 5))

--Ejemplo: busquedaDelTesoro "inicio" ((=='a').head) dicc2 = Just "alfajor"
